package com.wang.common.util;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.wang.common.pojo.InfoEnum;

/**
 * 加密的工具类
 * 
 * @author Zjx
 */
@Component
public class EncryptUtil
{
	@Autowired
	private RegexUtil regexUtil;
	
	/**
	 * 截取密文中按照$拆分的长度
	 */
	private int passLength = 3 ; 
	
	/**
	 * 加密算法
	 */
	private String encodeName = "sha256" ; 
	/**
	 * 分隔符
	 */
	private String split = "$" ;
	
	/**
	 * 加密
	 * 
	 * @param souStr 明文
	 * @return sha256(加密算法)$随机字符串$sha256(随机字符串+明文)是真的要调用sha256算法
	 *         sha256         $1111      $d2d02ea74de2c9fab1d802db969c18d409a8663a9697977bb1c98ccdd9de4372
	 */
	public String encodeStr(String souStr)
	{
		StringBuffer sb = new StringBuffer();
		/* sha256(加密算法)$ */
		sb.append(encodeName).append(split) ; 
		/* 随机字符串$ */
		String randStr = this.regexUtil.proccedRandStr(30, InfoEnum.VAR_NUMCHAR) ; 
		sb.append(randStr).append(split);
		/* sha256(随机字符串+明文) */
		String encodeSou = DigestUtils.sha256Hex(randStr + souStr) ; 
		sb.append(encodeSou);
		return sb.toString();
	}
	
	/**
	 * 验证密文
	 * 
	 * @param souStr 明文
	 * @return sha256(加密算法)$随机字符串$sha256(随机字符串+明文)是真的要调用sha256算法
	 *         sha256         $1111      $d2d02ea74de2c9fab1d802db969c18d409a8663a9697977bb1c98ccdd9de4372
	 */
	public boolean checkStr(String souStr,String encodeStr)
	{
		/* 截取,获取随机字符串 */
		String[] encodeStrs = encodeStr.split("\\$");
		//System.out.println(encodeStrs.length + "====" + Arrays.toString(encodeStrs));
		if(encodeStrs.length != this.passLength)
		{
			return false ; 
		}
		
		StringBuffer sb = new StringBuffer();
		/* sha256(加密算法)$ */
		sb.append(encodeName).append(split) ; 
		/* 随机字符串$ */
		String randStr = encodeStrs[1]; 
		sb.append(randStr).append(split);
		/* sha256(随机字符串+明文) */
		String encodeSou = DigestUtils.sha256Hex(randStr + souStr) ; 
		sb.append(encodeSou);
		
		/* 判断 */
		return sb.toString().equals(encodeStr);
	}
	
	public static void main(String[] args)
	{
		EncryptUtil encryptUtil = new EncryptUtil();
		
		String souStr = "111111" ; 
//		for(int i = 0 ; i < 5 ; i ++)
//		{
			/* 加密 */
			String encodeStr = encryptUtil.encodeStr(souStr) ; 
			System.out.println(souStr + "==加密==" + encodeStr);
			
			encodeStr = "sha256$KMXZ1QQuqQ1Do9yFZG9g72y4oaqVXy$a5f4272e3fa346565f5e316730a9c24e5966bab705e05ddd5f4d9fd5a09b9b32" ; 
			boolean flag = encryptUtil.checkStr("111111", encodeStr);
			System.out.println("=checkStr===>" + flag);
//		}
	}
}
